www.gusucode.com > Modeling Pneumatic Robot Actuators 工具箱matlab源码程序 > Modeling Pneumatic Robot Actuators/MSRA_PneumaticRobotSeries/Libraries/MultipartsLib/Extrusion_Scripts/Extr_Data_Cam_Roller_Curve.m
function [xy_data] = Extr_Data_Cam_Roller_Curve(cam_xsec,roller_rad,inout,varargin) %Extr_Data_Cam_Roller_Curve Produce curve data for a constraint that holds %a circular roller to an arbitrary cam profile % [xy_data] = Extr_Data_Cam_Roller_Curve(cam_xsec,roller_rad,inout) % This function returns x-y data for a cam formed from two circles % that are connected by lines tangent to the circles. % % You can specify: % Outer profile of cam cam_xsec % Radius of roller roller_rad % Roller placement on profile inout (Inside, Outside) % % To see a plot showing parameter values, enter the name % of the function with no arguments % >> Extr_Data_Cam_Roller_Curve % % To see a plot created with your parameter values, % add 'plot' as the final argument % >> Extr_Data_Cam_Roller_Curve([sind(1:4:360)' 1.5*cosd(1:4:360)'],0.2,'Outside','plot') % Copyright 2017-2018 The MathWorks, Inc. % Default data to show diagram if (nargin == 0) roller_rad = 0.02; % radius N = 100; % Number of sample points q = linspace(1/N,1,N)*2*pi; % Angles cam points r = 4+sin(2*q)+0.3*cos(3*q); % Radius cam points c = cos(q); s = sin(q); cam_xsec = [r'.*c' r'.*s']/100; % Cam profile inout = 'outside'; end % Check if plot should be produced if (isempty(varargin)) showplot = 'n'; else showplot = varargin; end if(strcmpi(inout,'inside')) normdir = -1; else normdir = 1; end % Calculate path for roller constraint cam_radius = sqrt(cam_xsec(:,2).^2+cam_xsec(:,1).^2); cam_radius_delta = circshift((circshift(cam_radius, -2) - cam_radius)/2,1); cam_angles = unwrap(atan2(cam_xsec(:,2),cam_xsec(:,1))); cosa = cos(cam_angles); sina = sin(cam_angles); cam_angles_delta = (circshift(cam_angles, -1) - cam_angles); cam_angles_delta(end) = cam_angles_delta(end)+2*pi; d_camrad_dq = cam_radius_delta ./ cam_angles_delta; cam_tang_vec = [d_camrad_dq.*cosa d_camrad_dq.*sina] + [cam_radius.*-sina cam_radius.*cosa]; cam_norm_vec = normdir*[cam_tang_vec(:,2) -cam_tang_vec(:,1)]; cam_offset_curve = cam_xsec+[... roller_rad*cam_norm_vec(:,1)./sqrt(cam_norm_vec(:,2).^2+cam_norm_vec(:,1).^2) ... roller_rad*cam_norm_vec(:,2)./sqrt(cam_norm_vec(:,2).^2+cam_norm_vec(:,1).^2)]; xy_data = cam_offset_curve; % Plot diagram to show parameters and extrusion if (nargin == 0 || strcmpi(showplot,'plot')) % Figure name figString = ['h1_' mfilename]; % Only create a figure if no figure exists figExist = 0; fig_hExist = evalin('base',['exist(''' figString ''')']); if (fig_hExist) figExist = evalin('base',['ishandle(' figString ') && strcmp(get(' figString ', ''type''), ''figure'')']); end if ~figExist fig_h = figure('Name',figString); assignin('base',figString,fig_h); else fig_h = evalin('base',figString); end figure(fig_h) clf(fig_h) temp_colororder = get(gca,'defaultAxesColorOrder'); % Plot extrusion data patch(cam_xsec(:,1),cam_xsec(:,2),[1 1 1]*0.90,'EdgeColor','none'); hold on h2 = plot(xy_data(:,1),xy_data(:,2),'-','Marker','o','MarkerSize',4,'LineWidth',2); h3 = plot(cam_xsec(:,1),cam_xsec(:,2),'.','MarkerSize',6,'MarkerEdgeColor',[1 1 1]*0.70); h4 = plot(0,0,'+','MarkerEdgeColor','k'); roller_patch_avec = linspace(1/50,2*pi,50)'; roller_patch_data = ... [sin(roller_patch_avec) cos(roller_patch_avec)]*roller_rad + repmat(xy_data(1,:),length(roller_patch_avec),1); patch(roller_patch_data(:,1),roller_patch_data(:,2),temp_colororder(1,:),'EdgeColor','none','FaceAlpha',0.3); axis('equal'); hold off box on % Show parameters hold on h5 = plot([cam_xsec(1,1) xy_data(1,1)],[cam_xsec(1,2) xy_data(1,2)],'k-d','MarkerFaceColor','k','MarkerSize',4); hold off title('[xy\_data] = Extr\_Data\_Cam\_Roller\_Curve(cam\_xsec,roller\_rad,inout);'); legend([h2 h3],{'Roller Curve Points','Cam Profile Points'},'Location','Best') clear xy_data end